package dao

import (
	"fmt"
	"service/app/dto"
	"service/app/mode"
	"strings"

	"gorm.io/gorm"
)

type MenuDao struct {
	BaseDao
}

var menuDao *MenuDao

func MenuDaoInit() *MenuDao {
	if menuDao == nil {
		menuDao = &MenuDao{BaseDao: newBaseDao()}
	}
	return menuDao
}

func (m *MenuDao) MenusByIdsD(param *dto.ImenuList_updata) (*[]mode.Db_menu, error) {
	var menuList []mode.Db_menu
	err := m.Orm.Model(&mode.Db_menu{}).Where("api_id in ?", param.Menus).Find(&menuList).Error
	if err != nil {
		return nil, err
	}
	return &menuList, err
}

// 搜索关联前端URL地址
func (m *MenuDao) MenusByUrlD(param *dto.Ipm_pmUrlList) (*[]mode.Db_menu, error) {
	var menuList []mode.Db_menu
	err := m.Orm.Model(&mode.Db_menu{}).Where("path in ?", param.Pm).Find(&menuList).Error
	if err != nil {
		return nil, err
	}
	return &menuList, err
}

func (m *MenuDao) MenuAddListD(param *dto.Imenulist_Add) error {
	return m.Orm.Save(param).Error
}
func (m *MenuDao) MenuAdd(param *dto.ImenusAdd) error {

	var (
		exites_pm *mode.Db_pm
		err       error
		acPm      dto.Ipm_add
	)

	// 开启事务后
	return m.Orm.Transaction(func(tx *gorm.DB) error {
		var newMenu = param.ConverMenuAdd(param)
		// 先判断数据库是否存在在
		if len(param.Path) > 0 {
			res := strings.Split(param.Path, "_")
			acPm = dto.Ipm_add{Url: res[0], Method: res[1], Fullpath: param.Path}
			exites_pm, err = pmDao.PmSqlExitsD(&acPm)
			if err != nil {
				return err
			}
			if exites_pm.ID > 0 {
				newMenu.Api_id = int(exites_pm.ID)
			} else {
				var cachePm = acPm.CoverPm()
				err := tx.Model(&mode.Db_pm{}).Create(&cachePm).Error
				if err != nil {
					return err
				}
				newMenu.Api_id = int(cachePm.ID)
			}
		}

		err = tx.Model(&mode.Db_menu{}).Create(newMenu).Error
		if err != nil {
			return err
		}
		return nil
	})
}

func (m *MenuDao) MenuAll() (*[]mode.Db_menu, error) {
	var menulist []mode.Db_menu
	err := m.Orm.Model(&mode.Db_menu{}).Find(&menulist).Error
	if err != nil {
		return nil, err
	}
	return &menulist, nil
}

func (m *MenuDao) MenuFindById(id int) (menu *mode.Db_menu, err error) {
	var obj mode.Db_menu
	if err := m.Orm.Where("id=?", id).First(&obj).Error; err != nil {
		return nil, fmt.Errorf("id:%v 未找到该数据", id)
	}
	return &obj, nil
}

func (m *MenuDao) MenuDel(id *dto.ReqIdDto) error {
	menu, err := m.MenuFindById(id.Id)
	if err != nil {
		return err
	}
	// 硬删除
	if err := m.Orm.Unscoped().Delete(&menu).Error; err != nil {
		// if err := m.Orm.Delete(&menu).Error; err != nil {
		return err
	}
	return nil
}
func (m *MenuDao) MenuEiteD(id int, param *dto.ImenusAdd) error {
	// 查找PM地址是否存在,
	if len(param.Path) > 0 {
		path := strings.Split(param.Path, "_")
		exites, err := pmDao.PmSqlExitsD(&dto.Ipm_add{Url: path[0], Method: path[1]})
		if err != nil {
			return fmt.Errorf("修改menu id:%v 更新失败,path未正确", id)
		}
		param.Api_id = int(exites.ID)
	}
	errs := m.Orm.Model(&mode.Db_menu{}).Where("id=?", id).Updates(param).Error
	if errs != nil {
		return fmt.Errorf("menu id:%v 更新失败", id)
	}
	return nil
}
